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

如何修复未处理的异常:抛出sqle的java.sql.SQLException,java,database,sqlite,android-studio,Java,Database,Sqlite,Android Studio,作为我的应用程序(API 11)的一部分,我需要提供一个预定义的数据库,我在网上找到了一个教程。下面是java代码,但我在(throw sqle;)上得到一个错误“Unhandled exception:java.sql.SQLException” 有没有办法解决这个问题 谢谢你的时间 package com.wima.twomatrixlibrarisampletest; import android.database.Cursor; import android.os.Bundle; im

作为我的应用程序(API 11)的一部分,我需要提供一个预定义的数据库,我在网上找到了一个教程。下面是java代码,但我在(throw sqle;)上得到一个错误“Unhandled exception:java.sql.SQLException”

有没有办法解决这个问题

谢谢你的时间

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());
            }
        }
    });
}
}
我的“修复方法”是:在做进一步的android/数据库工作之前,先学习基本的java基础知识

一个好的起点可能是

您可以看到,您的代码所在的方法声明为:

public void onClick(View v) {
[禁止投掷条款!]

但你却想在

throws sql exception 
用那种方法!那根本不行!编译器告诉您,您的代码必须处理已检查的异常。你看,该方法的签名不包含任何throws子句,而且不能同时包含这两种方式。要么是空throws子句,然后是no throw调用;或扔电话;但是,您需要在方法上使用throws子句

换言之:你的想法只是重新引用捕获的异常

  • 毫无意义
  • 是不正确的-因为封闭方法不允许您抛出未在onClick方法的
    throws
    子句中列出的选中异常
  • 当然,在重写该方法时,不能简单地将其更改为

    @Override
    public void onClick(View v) throws SqlException
    
    因为“Android”用户不希望您的代码抛出选中的异常


    长话短说:不要盲目地重复那个例外,你必须找到其他方法来处理那个失败!为了做到这一点;你应该首先对自己所做的事情进行教育。因为正如你的代码现在看起来一样,你似乎正在收集一些想法(可能来自这样的网站),希望最终得到一些有用的东西。提示:这将不起作用。您将从一个编译器错误运行到下一个编译器错误;即使你有东西要编译,你的应用程序也会一直崩溃。因为,如前所述,你不知道自己在做什么。这永远是通往灾难的道路

    只需扩展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();
     }
    

    异常有两种类型:已处理异常和运行时异常

    必须捕获(Try-Catch)或抛出(throws)已处理的异常

    示例SQLExceptionIOException

    可以捕获运行时异常,但不需要将其声明为抛出

    示例:OutOfMemoryExceptionIndexOutOfBoundsException

    SQLException是一个已处理的异常,因此,当另一个答案声明时,您必须在try-catch块中围绕调用来处理异常或声明异常

    public void onClick(View v) throws SqlException {
    
    在您的情况下,您正在捕获它,然后重新引用它,这意味着该方法必须将其声明为抛出,这会破坏try-catch的对象,通常除非您需要抛出它,否则您应该记录错误,然后静默继续,在您的情况下,您正在声明抛出e;这实际上是将问题提升到一个级别,要做到这一点,您需要像前面提到的那样声明方法抛出它throw new Error()是一个运行时异常,因此不需要声明它,因此如果您不想声明抛出它,您可以尝试以下操作

    throw new Error(sqle.getMessage());
    

    例外的信息是什么?sqle.getMessage()返回什么?我很确定在android中不会出现
    SQLExceptions
    。如果有的话,你会得到的。请去阅读Java教程。这真是基本的东西。他已经试过了。他在接球时重新投球。您的回答很抱歉,没有帮助,您刚才添加的关于在中添加throws子句的部分完全是胡说八道,因为在重写方法时这是不可能的@GhostCat:我的意思是这行c=myDbHelper.query(“EMP_TABLE”,null,null,null,null,null);在代码中没有涉及到尝试,然后修复你的答案,说出你的意思。到目前为止,它与他的问题没有真正的联系,并且给出了错误的建议。好吧,你有一堆代码,但没有任何解释。所以,不要再投反对票了,但不要指望这样的事情会获得赞成票。