2011-05-06 72 views
0

可以给我一些解释错塔为什么当我在Android模拟器部署请告诉我河内

public class towers extends Activity { 

    /** Called when the activity is first created. */ 
    private EditText text; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     text = (EditText) findViewById(R.id.editText1); 
    } 

    static int moves = 0; 
    static int totalDisks = 0; 

    public void myClickHandler(View view) throws java.io.IOException { 
     char fromPole = 'A'; 
     char withPole = 'B'; 
     char toPole = 'C'; 

     switch (view.getId()) { 
      case R.id.editText1: 

       if (text.getText().length() == 0) { 
        Toast.makeText(this, "Please enter number of disks", 
          Toast.LENGTH_LONG).show(); 
        return; 
       } 
       float disks = Float.parseFloat(text.getText().toString()); 
       FileOutputStream fos = new FileOutputStream("TowersOfHanoiSolution.txt"); 
       PrintStream ps = new PrintStream(fos); 
       solveHanoi(disks, fromPole, toPole, withPole, ps); 
       ps.close(); 
       System.out.println(); 
       text.setText("\nAmount of moves: " + moves + "\n"); 
     } 

    } 

    static void solveHanoi(float disks, char start, char end, char intermediate, PrintStream ps) { 
     if (disks >= 1) { 
      solveHanoi(disks-1, start, intermediate, end, ps); 
      moveDisk(start, end, ps); 
      solveHanoi(disks-1, intermediate, end, start, ps); 
     } 
    } 

    static void moveDisk(char fromPole, char toPole, PrintStream ps) { 
     moves++; 

     if(totalDisks <= 10){ 
      System.out.print("Move from " + fromPole + " to " + toPole + ". "); 
      ps.print("Move from " + fromPole + " to " + toPole + ". "); 
      if (moves%4 == 0){ 
       System.out.println(); 
       ps.println(); 
      } 
     } 
     else { 
      ps.print("Move from " + fromPole + " to " + toPole + ". "); 
      if (moves%4 == 0){ 
       ps.println(); 
      } 
     } 
    } 
} 
+6

如果你解释了你期望发生的事情和未发生的事情,它将会很有用。 – 2011-05-06 19:48:24

+2

首先,谁应该解决这个难题 - 用户还是算法? – 2011-05-06 19:52:13

+0

我是第二个@约翰说的,而且你也需要提供你的布局,因为代码至多是我们需要帮助你的75%。仅查看代码,您没有为editText1设置点击处理程序,因此,在单击editText1时看起来您想要执行某些操作,但实际上并未将点击处理程序链接到该控件。 – RivieraKid 2011-05-06 20:10:21

回答

1

我会假设你的布局的属性声明myClickHandler这个代码不会工作editText1,但最好包含您的布局以防止人们猜测。例如,如果onClick处理程序连接不正确或根本没有连接,则会收到另一个异常,或者什么都不会发生。

但我会假设该方法被正确调用。你试图建立一个没有指定路径的文件,因此它试图打开/TowersOfHanoiSolution.txt并接收FileNotFoundException,火灾原因是“只读文件系统”:

Caused by: java.io.FileNotFoundException: /TowersOfHanoiSolution.txt (Read-only file system) 
    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method) 
    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:94) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:165) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:144) 
    at com.example.towers.towers.myClickHandler(towers.java:49) 
    ... 14 more 

你使用Eclipse?如果您使用Eclipse进行调试,则可以在logcat窗口中获得类似上面的堆栈跟踪,并且还可以挂起执行,让您检查应用程序的状态。但是,只需要观察adb logcat或Eclipse的LogCat窗口就可以更简单地查看异常情况;关键信息是引用您的代码的第一个行号。

请注意,这不是主要的例外;主要的例外是框架抱怨onClick调用失败。再一次的,这就是为什么在调试器中暂停执行可能过于复杂的原因,并且读取logcat以查看所有异常是什么更容易。

无论如何:您无法在Android上的/中创建文件;因为这是工作目录,所以您需要指定完整路径(我假设为SD卡)。像这样:

FileOutputStream fos = new FileOutputStream(new File(
    Environment.getExternalStorageDirectory(), 
    "TowersOfHanoiSolution.txt"));