2017-02-27 73 views
-3
public static void main(String[] args) { 

    Scanner keyboard = new Scanner(System.in); 
    String[] rows = new String[20]; 
    int num_rows = 0; 
    while (keyboard.hasNextLine()) 
    { 
     rows[num_rows] = keyboard.nextLine(); 
     num_rows++; 
    } 
    int width = rows[0].length(); 
    for(int c = 0; c < width; c++){ 
     for(int r = 0; r < num_rows; r++) 
      System.out.print(rows[r].charAt(c)); 
     System.out.println(); 
    } 
} 

我使用NetBeans和MAC停止編程。我試圖用Ctrl或Cmd + d或z來結束輸入。 Ctrl + d結束輸入,但此代碼:結束輸入精加工而成

int width = rows[0].length(); 
for(int c = 0; c < width; c++){ 
    for(int r = 0; r < num_rows; r++) 
     System.out.print(rows[r].charAt(c)); 
    System.out.println(); 
} 

不會運行。爲什麼它會停止輸入但不運行代碼的其餘部分?

UPDATE:

public static void main(String[] args) { 

    Scanner keyboard = new Scanner(System.in); 
    int num_rows = 0; 
    while (keyboard.hasNextLine()) 
    { 
     num_rows++; 
    } 
    System.out.println(""); 
} 
+1

您如何知道代碼無法運行?我運行該程序並確實執行了代碼,但引發了異常。 – Sweeper

+2

[什麼是調試器,它如何幫助我診斷問題?](http://stackoverflow.com/q/25385173/5221149) – Andreas

+1

對於我們來說,如果您可以通過此指定要實現的目標,那將很容易程序。 – Maverick

回答

-1

控制+ Z在Dos指示傳輸結束。它用於通過文件信號結束斷開終端,從而導致正在等待輸入的程序退出。 您還可以在this後添加的KeyListener爲一提,並獲得關鍵的價值,並相應地進行操作。

您可以通過添加一些檢查空字符串,以避免ArrayIndexOutOfBound異常,也避免了空字符串提高你的代碼。

Scanner keyboard = new Scanner(System.in); 
    String[] rows = new String[20]; 
    int num_rows = 0; 
    while (keyboard.hasNextLine() && num_rows<20)//check to add only 20 elements 
    { 
     String input=keyboard.nextLine(); 
     if(input!=null && !"".equals(input.trim()))//check to filter empty strings 
     { 
      System.out.println(num_rows); 
      rows[num_rows] = input; 
      num_rows++; 
     } 
    } 
    System.out.println("Processing Input:"); 
    int width = rows[0].length(); 

    //As per your code, these loops will execute for only first element of array 
    for(int c = 0; c < width; c++) 
    { 
     for(int r = 0; r < num_rows; r++) 
     { 
      System.out.print(rows[r].charAt(c)); 
     } 
     System.out.println(); 
    } 

UPDATE 你的代碼是進入無限循環,而不是打破按Ctrl + Z,因爲如果在這個掃描儀這是您的使用案例真實的輸入另一行keyboard.hasNextLine()將始終返回true。 要打破它,你需要使用哪個nextLine()此掃描器執行當前行,並返回跳過的輸入信息。

public static void main(String[] args) { 

Scanner keyboard = new Scanner(System.in); 
int num_rows = 0; 
while (keyboard.hasNextLine()) 
{ 
    num_rows++; 
    System.out.println(keyboard.nextLine()); //Moves sanner to next Line. Now Ctrl+Z will break the loop. 
} 
System.out.println("Outside Loop"); 
} 
+0

問題是關於Mac,那麼你爲什麼回答Dos?引用問題:*「我正在使用Netbeans和一個** Mac **」。* – Andreas

+0

@Andreas在您使用Eclipse和命令行進行註釋後,我嘗試了Ctrl + Z,但是Ctrl + Z並未打破用戶輸入的循環。你可以粘貼一個代碼片段嗎? – Maverick

+1

'掃描儀在=新的掃描儀(系統。在);列表 list = new ArrayList <>(); while(in.hasNextLine()){list.add(in.nextLine()); } System.out.println(「Lines:」+ list.size()); list.forEach(System.out :: println);'---代碼將打印行數,然後在行的開始處按Ctrl + Z,在命令提示符和Windows上的Eclipse中打印行。 – Andreas