Frage zu InputMismatchException, während mit Scanner
Die Frage :
Input-Datei: Kunden Kontonummer, Kontostand am
Anfang der Monats -, Transaktions-Typ (Abhebung, Einzahlung,
Zinsen), Transaktionsbetrag
Ausgabe: Kontonummer, Anfangssaldo, Endsaldo,
insgesamt gezahlten Zinsen, insgesamt eingezahlten Betrag, Anzahl der
Einzahlungen, Gesamtbetrag zurückgezogen, die Anzahl der Auszahlungen
package sentinel;
import java.io.*;
import java.util.*;
public class Ex7 {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws FileNotFoundException
{
int AccountNum;
double BeginningBalance;
double TransactionAmount;
int TransactionType;
double AmountDeposited=0;
int NumberOfDeposits=0;
double InterestPaid=0.0;
double AmountWithdrawn=0.0;
int NumberOfWithdrawals=0;
boolean found= false;
Scanner inFile = new Scanner(new FileReader("Account.in"));
PrintWriter outFile = new PrintWriter("Account.out");
AccountNum = inFile.nextInt();
BeginningBalance= inFile.nextDouble();
while (inFile.hasNext())
{
TransactionAmount=inFile.nextDouble();
TransactionType=inFile.nextInt();
outFile.printf("Account Number: %d%n", AccountNum);
outFile.printf("Beginning Balance: $%.2f %n",BeginningBalance);
outFile.printf("Ending Balance: $%.2f %n",BeginningBalance);
outFile.println();
switch (TransactionType)
{
case '1': //case 1 if we have a Deposite
BeginningBalance = BeginningBalance
+ TransactionAmount;
AmountDeposited = AmountDeposited
+ TransactionAmount;
NumberOfDeposits++;
outFile.printf("Amount Deposited: $%.2f %n",AmountDeposited);
outFile.printf("Number of Deposits: %d%n",NumberOfDeposits);
outFile.println();
break;
case '2'://case 2 if we have an Interest
BeginningBalance = BeginningBalance
+ TransactionAmount;
InterestPaid = InterestPaid
+ TransactionAmount;
outFile.printf("Interest Paid: $%.2f %n",InterestPaid);
outFile.println();
break;
case '3'://case 3 if we have a Withdraw
BeginningBalance = BeginningBalance
- TransactionAmount;
AmountWithdrawn = AmountWithdrawn
+ TransactionAmount;
NumberOfWithdrawals++;
outFile.printf("Amount Withdrawn: $%.2f %n",AmountWithdrawn);
outFile.printf("Number of Withdrawals: %d%n",NumberOfWithdrawals);
outFile.println();
break;
default:
System.out.println("Invalid transaction Tybe: " + TransactionType
+ TransactionAmount);
}
}
inFile.close();
outFile.close();
}
}
Aber ist gibt mir diese :
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at sentinel.Ex7.main(Ex7.java:36)
Java Result: 1
FYI, die Verwendung
double
zu vertreten, Geld ist ein bad Idee. Aber für die Hausaufgaben ist das auch in Ordnung.InformationsquelleAutor user325045 | 2010-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie ich Verfahren würde:
Konnten Sie nicht wissen, wie Sie Ihre debugger noch, und während einige vielleicht nicht Zustimmen, ich denke es ist nie zu früh. Es gibt einige ausgezeichnete video-tutorials auf, wie Sie den debugger verwenden hier. Viel Glück!
InformationsquelleAutor JRL
Ich denke, es ist ein wenig zu spät, um diese Frage zu beantworten, aber vor kurzem habe ich stolperte über das gleiche problem, und mein googeln hat mich hierher geführt.
Ich denke, der häufigste Fall für
InputMismatchException
geworfenScanner.nextDouble()
ist, dass Ihre Standard-Gebietsschema, das verwendet wird, indem Sie IhreScanner
erwartet verdoppelt, in anderen format (zum Beispiel10,5
, nicht10.5
). Wenn das der Fall ist, sollten SieScanner.useLocale
Methode wie dieseInformationsquelleAutor Anton Guryanov
Wenn Sie Lesen, die
Exception
Nachrichten, es ist einInputMismatchException
. Dies ist sehr wahrscheinlich verursacht durch dienextDouble()
odernextInt()
Funktion, wenn es nicht das Lesen der richtige Typ. Stellen Sie sicher, dass Ihre Daten richtig ausgerichtet ist, und Sie sind sich nicht Lesen, Doppelzimmer mitreadInt()
.InformationsquelleAutor Xavier Ho
Möchten Sie vielleicht, um den Inhalt des
Account.in
mehr Informationen, aber hier sind einige Kommentare:Namenskonventionen
Dies bedeutet, dass durch Konvention, die Variablen-Namen sollten groß - /kleingeschrieben wie
accountNum
,beginningBalance
,numberOfDeposits
usw.Es sollte auch erwähnt werden, dass die Weise, die Sie platzieren Sie Ihre geschweiften Klammern sind sehr unkonventionell. Es kann eine gute Idee für Sie, um lernen, gute coding-Stil.
Dieser Teil ist auch höchst inkonsequent:
Ich bin mir zu 99% sicher, dass Sie wirklich brauchen, um
switch
aufcase 1:
,case 2:
,case 3:
statt.Können Sie auch drucken möchten, den Schluss-Saldo NACH Sie verarbeitet die Transaktion. Gerade jetzt, wirst du immer der selbe Nummern für Anfang und Schluss-Saldo.
Es können auch Sie profitieren, zu wissen, dass Java hat "compound assignment" - Operatoren, würde Ihr code viel besser lesbar. Müssen Sie wahrscheinlich nicht Sie sich mit der genauen Semantik, gerade jetzt, aber im Grunde statt:
Können Sie stattdessen schreiben:
Schließlich eine Letzte Bemerkung über die
InputMismatchException
: die anderen haben schon erklärt, was dies bedeutet. Meine beste Vermutung ist jetzt, dass Ihr problem durch diese verursacht werden:vs:
Muss ich sehen
Account.in
zu bestätigen, aber ich vermute, dass dieint
Vorgangsart angezeigt wird, bevor diedouble
Transaktion Betrag, genau wie die Problembeschreibung sagt. Dein code liest Sie in der umgekehrten Reihenfolge.Dieser versuchen würde, Lesen Sie die
int
alsnextDouble()
, das ist okay, aber diedouble
alsnextInt()
werfen würdeInputMismatchException
.es sieht aus wie
Account.in
hatdouble int
füramount type
, so dass die Bestellung in Ordnung ist. Sie wollen auf jeden Fallswitch
aufcase 1:
stattcase '1':
, obwohl. Ich würde vorschlagen, Debuggen, entweder mit einem integrierten Schritt-durch, oder nur darum, vieleSystem.out.println
Aussagen, z.B. jedes mal, wenn Sie etwas Lesen von der Eingabe drucken auf dem Bildschirm, was es war. So wissen Sie, , wenn die exception wird geworfen, und hoffentlich lokalisieren das problem und beheben es.InformationsquelleAutor polygenelubricants
Ich nicht besonders wie das design, alles in einem, wie es geht gegen die stärken von Java, ein bisschen Objekt-Orientierung. So schrieb ich das Programm entlang der Linien ich denke.
Habe ich auch herausgefunden, dass die Interpretation verdoppelt ist locale-abhängige, auf meinem Rechner ein Doppelzimmer (in einem string) müsste ein Komma (12,12) und nicht einen Punkt (12.12), so dass möglicherweise dein problem.
Und wie gesagt von polygenelubricants, Mitglied und Methodennamen sind niedriger verkleidet in Java, nur Typen verwenden, groß - /Kleinschreibung.
Habe ich meine eigene Umsetzung nicht, weil Ihr nicht arbeiten, sondern zu zeigen, wie Sie konnte, Verantwortlichkeiten zu Klassen, die der Ausdruck der problem-Domäne, so dass der code ein wenig besser lesbar (obwohl deutlich mehr mit vorformulierten Getter und setter).
Meine Umsetzung des Programms wäre so etwas wie:
Kein problem. Ich weiß, es sieht aus wie overkill. Ich normalerweise arbeiten Sie mit Java-code in den vielen tausenden von Linien, die eingehalten werden muss und erstreckte sich über viele Jahre. Es erzwingt eine andere Art von design 🙂
InformationsquelleAutor extraneon