在do While循环中获取“线程中的异常”主“java.util.InputMismatchException”错误

时间:2017-05-31 17:03:24

标签: java java.util.scanner inputmismatchexception

import java.util.Random;
import java.util.Scanner;


public class Jogo {
 Scanner scanner = new Scanner(System.in);
int tipoJogo;
int turno;
Barco[] jfA,jfB;
Random random = new Random();

public Jogo(Barco[]fA, Barco[]fB, int tamanhomax, int tj)
{
    for(int i =0;i<tamanhomax;i++)
    {
        fA[i]=fB[i]=null;
    }

    jfA = fA;
    jfB = fB;
    tipoJogo=tj;
}



//public Barco[] getFrota() {
//  return frota;
//}
int linhaAC = random.nextInt(7);
int colunaAC = random.nextInt(7);
int orientação = random.nextInt(1);



public Jogo(int TipoJogo){
    TipoJogo = tipoJogo;
}
public  void manual1(){
    System.out.println("Jogador A");
    System.out.println("Insira as coordenadas do Aircraft Carrier e a sua orientação(0 horizontal, 1 vertical):");
    //linhaAC = scanner.nextInt();
    //colunaAC = scanner.nextInt();

    String op= scanner.nextLine();

    int linhaAC = (int) Character.toUpperCase(op.charAt(0))-'A'; //vai buscar o primeiro caracter da String op e transforma do A ao I em interiros 0 a 8
    int colunaAC = (int) op.charAt(1)-'1';
    int orientação = scanner.nextInt();
    System.out.println(linhaAC +"  -  " + colunaAC);


    do{

        System.out.println("Fora do tabuleiro");
        System.out.println("Insira de novo as coordenadas do Aircraft Carrier:  ");
        linhaAC= (int) Character.toUpperCase(op.charAt(0))-'A';
        colunaAC = (int) op.charAt(1)-'1';
        orientação = scanner.nextInt();

    }while((colunaAC > 4 && orientação == 0)|| (linhaAC > 'D' && orientação == 1));

好的我收到以下错误代码:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Jogo.manual1(Jogo.java:147)
at Main.start(Main.java:134)
at Main.main(Main.java:26)

当我尝试在do while循环中为变量LinhaAC和ColunaAC设置新值时会发生这种情况。

基本上,如果我将LinhaAC设置为大于'D'或ColunaAC大于4,则启动Do while循环,我要求用户向这些变量插入新值。

因此,当我尝试设置新值时,在插入LinhaAC和ColunaAC之后按i键,这样我就可以为“orientação”选择新值,它会触发错误。

它只发生在do while组内。在第一次插入值时,它不会给出任何错误。

编辑:即使我使用的是第一次选择的相同值,也会发生这种情况。它不像我在scanner.next()上插入一个int;

2 个答案:

答案 0 :(得分:0)

您的代码中没有错误。原因是你得到InputMismatchException,因为你的输入与变量类型不匹配。

你正在接受他们的类型应该匹配的三个输入。

这就是出现这些错误消息的原因:

at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)

作为例子:

orientação = scanner.nextInt();

此行需要整数值,但如果您向其添加String,则为InputMismatchException

解决方案:

为了避免这种情况,你可以处理输入类型,如果它不是整数,你可以通过try-catch block显示正确的消息。

try{
    orientação = scanner.nextInt();
}catch(InputMismatchException e){
    System.out.println("Enter only integer");
}

或者您可以打印错误消息,如

//...
catch(InputMismatchException e){
    System.out.println(e);
}

同样为键盘输入的每个输入执行此操作。这样可以避免出现错误信息并使程序更易于处理。

详细了解exception handling

答案 1 :(得分:0)

最后我解决了。

public  void manual1(){
    System.out.println("Jogador A");
    System.out.println("Insira as coordenadas do Aircraft Carrier e a sua 
     orientação(0 horizontal, 1 vertical):");
    //linhaAC = scanner.nextInt();
    //colunaAC = scanner.nextInt();

    String op= scanner.next();

    int linhaAC = (int) Character.toUpperCase(op.charAt(0))-'A';
    int colunaAC = (int) op.charAt(1)-'1';
    int orientação = scanner.nextInt();
    System.out.println(linhaAC +"  -  " + colunaAC);


    while((colunaAC >= 4 && orientação == 0) || (linhaAC >= 4 && orientação == 1)){

        System.out.println("Fora do tabuleiro");
        System.out.println("Insira de novo as coordenadas do Aircraft Carrier:  ");
        op= scanner.next();
        linhaAC=(int)Character.toUpperCase(op.charAt(0))-'A';
        colunaAC = (int) op.charAt(1)-'1';
        orientação = scanner.nextInt();
        System.out.println(linhaAC +"  -  " + colunaAC);


    }