如何修复未处理的异常:throw sqle的java.sql.SQLException

时间:2016-10-20 08:04:43

标签: java database sqlite android-studio

作为我的应用程序(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());
            }
        }
    });
}
}

3 个答案:

答案 0 :(得分:4)

我的想法如何修复"是:学习基础java基础知识,然后再做进一步的android /数据库工作!

一个好的起点可能是The Java lesson about exceptions

你知道,你的代码所在的方法被声明为:

public void onClick(View v) {

[没有抛出条款! ]

但是你想放置一个

throws sql exception 

在那个方法中!这根本无法奏效!编译器告诉您,您的代码必须处理该已检查的异常。你看,该方法的签名不包括任何throws子句,你不能两种方式。空抛出子句,然后没有抛出调用;或者打电话;但是你需要一个关于该方法的throws子句!

换句话说:你只是重新抛出异常的想法

  1. 毫无意义
  2. 完全不正确 - 因为封闭方法不允许您抛出一个未在onClick方法的throws子句中列出的已检查异常。
  3. 当然:因为你覆盖这种方法,你不能简单地将其改为

    @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();
 }