Java:scanner编译错误

时间:2015-11-21 14:31:36

标签: java java.util.scanner

我目前正在制作简单的战舰游戏。我使用Java扫描程序从用户那里获取坐标。如果我在eclipse中运行此代码我没有错误,一切都很好。但如果我在另一个编译器中运行代码(例如http://www.compilejava.net/),我会收到此错误:

  

线程中的异常" main" java.util.NoSuchElementException:找不到行     在java.util.Scanner.nextLine(Scanner.java:1540)     在SchiffeVersenken.attack(SchiffeVersenken.java:57)     在SchiffeVersenken.main(SchiffeVersenken.java:38)

所以我知道这个问题与扫描仪和" .nextLine()" -method有关,但我不熟悉java,也没有解决这个问题。

import java.util.Scanner;

public class SchiffeVersenken {

    // "Lebenspunkte" der Spieler
    static int userLife = 30;
    static int enemyLife = 30;
    // Spielbrett beider Spieler
    static char[][] user = {
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '#', '#', '#', '#', '#', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '#', '#', '#', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '#', '#', '#', '#', '#' },
        { '.', '.', '.', '.', '.', '#', '#', '#', '#', '#' },
        { '.', '.', '.', '.', '.', '#', '#', '#', '#', '#' }
    };
    static char[][] enemy = {
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' }
    };

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        while(userLife > 0 && enemyLife > 0) {
            attack(s);
            defend(s);
        }
        s.close();

        if(userLife == 0) {
            System.out.println("Alle Schiffe sind versenkt worden. Sie haben leider verloren!");
        } else {
            System.out.println("Alle Schiffe des Gegners sind versenkt worden. Sie haben gewonnen!");
        }

    }

    public static void attack(Scanner s) {

        String inputHit;
        int inputRow, inputColumn;

        System.out.println("Bitte Zeile des Ziels eingeben: ");
        inputRow = Integer.parseInt(s.nextLine());
        System.out.println("Bitte Spalte des Ziels eingeben: ");
        inputColumn = Integer.parseInt(s.nextLine());
        System.out.println("Koordinaten des Zeils: " + inputRow + "/" + inputColumn);

        System.out.println("Ziel getroffen? (y oder n)");
        inputHit = s.nextLine();

        if(inputHit.equals("y") | inputHit.equals("n")) {
            if(inputHit.equals("y")) {
                enemy[inputRow][inputColumn] = 'X';
                System.out.println("Boom! Guter Schuss!");
                enemyLife -= 1;
            } else {
                enemy[inputRow][inputColumn] = 'O';
                System.out.println("Oh je! Leider nicht getroffen!");
            } 
        } else {
            System.out.println("Ziel getroffen? (y oder n)");
            inputHit = s.next();
        }

        print(enemy);

    }

    public static void defend(Scanner s) {

        int inputRow, inputColumn;

        System.out.println("Bitte Zeile des Ziels eingeben: ");
        inputRow = Integer.parseInt(s.nextLine());
        System.out.println("Bitte Spalte des Ziels eingeben: ");
        inputColumn = Integer.parseInt(s.nextLine());
        System.out.println("Koordinaten des Zeils: " + inputRow + "/" + inputColumn);

        if(user[inputRow][inputColumn] == '#') {
            user[inputRow][inputColumn] = 'X';
            System.out.println("Boom! Schiff unter Beschuss!");
            userLife -= 1;
        } else {
            user[inputRow][inputColumn] = 'O';
            System.out.println("Gott sei Dank! Nicht getroffen!");
        }

        print(user);

    }

    public static void print(char[][] grid) {

        System.out.println(" 0123456789");
        for(int i=0; i<10; i+=1) {
            System.out.print(i);
            for (int j=0; j<10; j+=1) {
                System.out.print(grid[i][j]);
                if(j == 9) {
                    System.out.println();
                }
            }
        }
        System.out.println();

    }

}

1 个答案:

答案 0 :(得分:1)

如果代码在IDE中运行,那么一切都是正确的。 Scanner的工作方式是:

Scanner input = new Scanner(System.in); 

系统为java.lang.System,它有静态对象,中的属于InputStream类型, out 错误属于PrintStream类型。

基本上System.in是InputStream对象,它连接到一个源,它应该从那里得到数据 - 它们是键盘。

在线IDE应该以这样的方式设计:它应该通过键盘等模拟InputStream和Input以及你提到的Compile Java未正确运行代码的问题是模拟输入的问题从键盘扫描仪的方式期望它。故障不是来自您的代码,而是来自在线编译器。为了证明我的观点,请尝试使用此link中的不同Java编译器。

如果您想了解Scanner在java中的工作原理,请参阅我在Stackoverflow中给出的这个question的答案。在那里我详细解释了什么是Scanner,它是如何工作的。