作为我的应用程序(API 11)的一部分,我需要提供一个预定义的数据库,我在网上找到了一个教程。所以这是java代码,但我得到一个错误“未处理的异常:java.sql.SQLException”on(throw sqle;)。
任何想法如何解决?
感谢您的时间
package com.wima.twomatrixlibrarisampletest;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.sql.SQLException;
public class Main210Activity extends AppCompatActivity {
Cursor c = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main210);
((Button) findViewById(R.id.button01)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatabaseHelper myDbHelper = new DatabaseHelper(Main210Activity.this);
try {
myDbHelper.createDataBase();
} catch (IOException ioe) {
throw new Error ("Unable to create database");
}
try {
myDbHelper.openDataBase();
} catch (SQLException sqle) {
throw sqle;
}
Toast.makeText (Main210Activity.this, "Plz Work!", Toast.LENGTH_LONG).show();
c = myDbHelper.query("EMP_TABLE", null, null, null, null, null, null);
if(c.moveToFirst()) {
do {
Toast.makeText(Main210Activity.this, "_id: " + c.getString(0) + "\n" +
"E_Flange: " + c.getString(1) + "\n" +
"E_Web: " + c.getString(2) + "\n" +
"E_Ratio: " + c.getString(3), Toast.LENGTH_SHORT).show();
}while (c.moveToNext());
}
}
});
}
}
答案 0 :(得分:4)
我的想法如何修复"是:学习基础java基础知识,然后再做进一步的android /数据库工作!
一个好的起点可能是The Java lesson about exceptions。
你知道,你的代码所在的方法被声明为:
public void onClick(View v) {
[没有抛出条款! ]
但是你想放置一个
throws sql exception
在那个方法中!这根本无法奏效!编译器告诉您,您的代码必须处理该已检查的异常。你看,该方法的签名不包括任何throws子句,你不能两种方式。空抛出子句,然后没有抛出调用;或者打电话;但是你需要一个关于该方法的throws子句!
换句话说:你只是重新抛出异常的想法
throws
子句中列出的已检查异常。当然:因为你覆盖这种方法,你不能简单地将其改为
@Override
public void onClick(View v) throws SqlException
作为" Android"人们不希望您的代码抛出已检查的异常。
长话短说:不必盲目地重新抛出异常,你必须找到其他方法来处理这个失败!为了做到这一点;你应该首先教育自己正在做的事情。因为你的代码现在看起来很像,你似乎正在把想法(可能来自这样的网站)拉到一起,希望最终得到一些有用的东西。并提示:不工作。您将从一个编译器错误运行到下一个;即使你有编译的东西,你的应用程序将一直崩溃。因为,正如所说的,你不知道你在做什么。这始终是一条通向灾难的道路。
答案 1 :(得分:3)
异常有两种类型Handled和Runtime。
处理异常必须捕获(尝试捕获)或抛出(抛出)
示例 SQLException , IOExeption
可以捕获运行时异常,但不需要将它们声明为抛出。
示例: OutOfMemoryException , IndexOutOfBoundsException 。
SQLException是一个Handled Exception,因为声明的另一个答案是你必须在try catch块中包围你的调用以处理异常或声明
public void onClick(View v) throws SqlException {
在你的情况下,你正在抓住它然后重新抛出它,这意味着该方法必须声明它被抛出哪种类型会破坏try catch的对象,通常除非你需要抛出它,你应该记录错误然后默默地继续,在你的情况下你宣布扔e;这只是字面上把问题提升到一个级别,要做到这一点你需要如前所述 - 声明方法抛出它抛出新的Error()是一个运行时异常所以它不需要声明,所以如果你不想声明它抛出你可以尝试类似
的东西throw new Error(sqle.getMessage());
答案 2 :(得分:1)
只需将try / catch扩展到数据库事务结束:
try {
.....
.....
Toast.makeText (Main210Activity.this, "Plz Work!", Toast.LENGTH_LONG).show();
c = myDbHelper.query("EMP_TABLE", null, null, null, null, null, null);
if(c.moveToFirst()) {
do {
Toast.makeText(Main210Activity.this, "_id: " + c.getString(0) + "\n" +
"E_Flange: " + c.getString(1) + "\n" +
"E_Web: " + c.getString(2) + "\n" +
"E_Ratio: " + c.getString(3), Toast.LENGTH_SHORT).show();
}while (c.moveToNext());
}
}
catch(SQLException e)
{
e.printStackTrace();
}