Ciągle pojawia się błąd W przypadku ciągu wejściowego: „” w moim kodzie [duplikat]

Nov 19 2020

Ciągle otrzymuję ten błąd w moim kodzie. Myślę, że ma to związek z moim poleceniem parseInt (), ale nie jestem pewien. Próbuję utworzyć stos liczb całkowitych pochodzących z ciągu wejściowego użytkownika, takiego jak „PUSH 5”, i po prostu wyodrębnić 5 z ciągu, aby umieścić je na stosie.

import java.util.*;

public class lab6
{
    public static void main(String []args)
    {
        Scanner sc = new Scanner(System.in);
        int size = sc.nextInt();
        
        lab6stack theStack = new lab6stack(size);
        String [] ar = new String [size];
        
        for(int i = 0; i < size; i++)
        {
            ar[i] = sc.next();
            
            if(ar[i].charAt(1) == 'U')
            {
                String sub = ar[i].substring(4);
                int num = Integer.parseInt(sub);
                
                theStack.push(num); 
            }
            
            else if(ar[i].charAt(1) == 'O')
            {
                theStack.pop();
            }
        }
        
        while (!theStack.isEmpty())
        {
            System.out.println(theStack.pop());
        }
    }
}

Odpowiedzi

1 null_awe Nov 19 2020 at 03:14

Jak powiedzieli inni, sc.next()tylko wraca "PUSH", a nie "PUSH 5". Moim zdaniem rozwiązanie @ Pshemo działa dobrze, ale powiedziałeś, że nie tak chcesz to zrobić. W takim przypadku można zastąpić sc.next()z sc.nextLine()dostać "PUSH 5". W ten sposób resztę kodu możesz zachować bez zmian.

Mam nadzieję, że tego chcesz!

MonsterDruide1 Nov 19 2020 at 02:55

Odnosisz się do spacji między PUSHa numerem w tym wierszu:

String sub = ar[i].substring(4);

Ponieważ podciągi również zaczynają liczyć od zera, twoja liczba powinna zostać przeanalizowana podczas używania substring(5);tutaj zamiast. Oto przykład z indeksami:

"P"=0 ; "U"=1 ; "S"=2 ; "H"=3 ; " "=4 ; "3"=5
JohnMercier Nov 19 2020 at 03:59

Dzieje się tak, ponieważ nie sprawdzasz długości łańcucha przed przechwyceniem znaku.

tutaj:

if(ar[i].charAt(1) == 'U')

i tu:

else if(ar[i].charAt(1) == 'O')

Sprawdź z ar[i].length() >= 1. Na przykład:

if(ar[i].length() >= 1 && ar[i].charAt(1) == 'U')

Konieczne będzie również zastosowanie dwóch pozostałych poprawek opisanych w innych odpowiedziach.

Używaj sc.nextLine()podczas odczytywania wejścia i używaj substring(5)w przypadku "PUSH".