2016-06-29 11 views
0

Ich bin neu in der Programmierung, so denke nur über meine Fehler. Ich schreibe ein Programm, wo der Benutzer zwei eingegebene Zahlen in einer durch Leerzeichen getrennten Zeile gibt. Ich muss den ersten Eingang einer Integer-Variablen und zweitens einem Double zuweisen und muss etwas Mathematik durchführen und das Ergebnis anzeigen. Folgendes ist mein Code:Ausnahme im Thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 Fehler

import java.util.Scanner; 
public class foo{ 
    public static void main(String[] args){ 
     String b = null; 
     Scanner sc = new Scanner(System.in); 
     b = sc.next(); 
     String[] split = b.split(" "); 
     int i = Integer.parseInt(split[0]); 
     double d = Double.parseDouble(split[1]); 
     System.out.println(i+20); 
     System.out.println(d-1.50); 
    } 
}  

Und folgendes ist der Fehler, den ich bekomme, während es läuft.

F:\java\work\codechef>javac foo.java 

F:\java\work\codechef>java foo 
20 300.50 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
     at foo.main(foo.java:9) 

Zuerst habe ich versucht, es mit b=sc.readLine(); machen, aber es bekam ich folgende Fehlermeldung beim Kompilieren:

error: cannot find symbol 
       b = sc.readLine(); 
        ^
    symbol: method readLine() 
    location: variable sc of type Scanner 
1 error 

Warum ich diese Fehler immer bin und wie das oben beschriebene Problem zu lösen.

+3

Verwendung 'sc.nextLine' statt' sc.next' – Zircon

+0

@Tunaki Dies ist kein Duplikat, das Problem ist anders, obwohl es ArrayIndexOutOfBoundsException –

+0

@ krzyk wirft Das Problem ist das gleiche: ein Versuch wird unternommen, auf den Index eines Arrays zugreifen, das außerhalb der Grenzen war. Es ist ein Verständnis dieses Fehlers, der zu der Lösung führt, nämlich, warum 'split [1]' die Ausnahme auslöst, also warum 'b.split (" ")' ein Array der Länge 1 zurückgegeben hat, also warum 'next()' hatte nur 1 Platz. Das OP könnte sich auch auf http://stackoverflow.com/questions/22458575/whats-the-difference-between-next-and-nextline-methods-from-scanner-class beziehen. – Tunaki

Antwort

1

Sie haben sc.next() verwendet, die das nächste Token (ein Token ist etwas, das Delimiter vor und/oder nach hatte) zurückgibt, so dass es nur die 20 oder 300.50 in Ihrem Fall enthält.

Sie sollten sc.nextLine() verwenden, um später split zu verwenden, dies wird die vollständige Zeile zurückgeben.

oder benutzen:

int i = Integer.parseInt(sc.next()); 
double d = Double.parseDouble(sc.next()); 

Und los Linien erhalten:

b = sc.next(); 
    String[] split = b.split(" ");