java сгенерировать новую сборку NoSuchElementException не удалось с помощью arraylist - PullRequest
0 голосов
/ 20 февраля 2020

Я кодирую реализацию стека, используя Arraylist. Я пытаюсь использовать NoSuchElementException, когда он пытается всплыть, когда массив пуст, но я получаю сообщение об ошибке сборки, и я понятия не имею, что происходит. Вот вывод, который я получаю:

please enter your number: 

1 f
*********************Stack ArrayList Implementation*********************
false
1
1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.elementData(ArrayList.java:422)
    at java.util.ArrayList.get(ArrayList.java:435)
    at StackUsingArrayList.peek(StackUsingArrayList.java:42)
    at StackUsingArrayList.main(StackUsingArrayList.java:74)
C:\Users\alsrb\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 4 seconds)

эта часть кажется проблемой, и забавно то, что если я не использую исключения, она работает просто отлично.

int pop() {
if (!isEmpty()) { // checks for an empty Stack
      int popValue = stackList.get(stackList.size() - 1);
      stackList.remove(stackList.size() - 1); // removes the poped element             
      return popValue;
} else {
    throw new NoSuchElementException();
    //System.out.print("The stack is already empty  ");
    //return -1;
}
}

Кто-нибудь, пожалуйста, помогите мне. вот весь мой код

import java.util.ArrayList;
import java.util.NoSuchElementException;
import java.util.Scanner;

public class StackUsingArrayList{
Scanner scanner = new Scanner(System.in); 


ArrayList<Integer> stackList;

StackUsingArrayList() {
    stackList = new ArrayList<>();
}


void push(int v) {
    stackList.add(v);
}

int pop() {
    if (!isEmpty()) { // checks for an empty Stack
          int popValue = stackList.get(stackList.size() - 1);
          stackList.remove(stackList.size() - 1); // removes the poped element             
          return popValue;
    } else {
        throw new NoSuchElementException();
        //System.out.print("The stack is already empty  ");
        //return -1;
    }
}

boolean isEmpty() {
    if (stackList.get(0) == null){
        return true;
    } else {
        return false;
    }
}

int peek() {
    return stackList.get(stackList.size() - 1);
}

int size(){
    int i = 0;
    while(stackList != null){
        stackList.get(i);
        i++;
    }
return i;
}


public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in); 

    StackUsingArrayList myStack = new StackUsingArrayList();

    System.out.println("Please enter your number: ");

    while(scanner.hasNextInt()){
        int x = scanner.nextInt();
        if(x >= 0){
        myStack.push(x);
        }
    }


    System.out.println("*********************Stack ArrayList Implementation*********************");
    System.out.println(myStack.isEmpty());
    System.out.println(myStack.peek());
    System.out.println(myStack.pop()); 
    System.out.println(myStack.peek()); 
    System.out.println(myStack.pop()); 
    System.out.println(myStack.peek()); 
    System.out.println(myStack.pop()); 
}
}

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы уверены, что это работает без исключения? Из того, что я вижу, вы использовали вход «1», который заполняет вас ArrayList одним элементом. В вашем основном методе вы смотрите (возвращает «1»), а затем всплывает (возвращает «1»). И затем вы продолжаете просматривать и извлекать, в результате чего следующий вызов peek будет выполнен

int peek() {
    return stackList.get(stackList.size() - 1);
}

Поскольку вы уже выделили единственный элемент в списке, размер списка равен 0. Это означает, что вы пытаетесь вернуть stackList .get (0-1), который корректно генерирует исключение ArrayIndexOutOfBoundsException.

Вы можете добавить проверку в функцию просмотра, чтобы увидеть, остались ли элементы в списке. Если нет, то может быть хорошей идеей вернуть null.

Кроме того, было бы неплохо взглянуть на методы ArrayList, предоставляемые java. В частности, ArrayList.size () и ArrayList.isEmpty () являются хорошими альтернативами для использования.

1 голос
/ 20 февраля 2020

Ваша isEmpty() реализация неверна. Если stackList пусто, stackList.get(0) сгенерирует исключение.

Просто используйте stackList.isEmpty().

boolean isEmpty() {
    return stackList.isEmpty();
}
...