java - Android - NullPointerException 和 RuntimeException

标签 java android mysql jdbc

我目前正在从事我的高级项目,其中涉及从数据库获取数据并将其存储,然后将其显示在应用程序上。所以我最近遇到了问题,代码主要返回两个错误:

  1. RuntimeException:不确定是什么原因导致的
  2. NullPointerException: 由于busList 数组返回空

这是我的代码:

Activity: ShowResults.java

public class ShowResults extends ActionBarActivity {
private static Connection connection = null;
private static String[] busList;
public double lat=24.197910, lon=55.678712;
public static double[][] locCoords = {{24.214649, 55.705841},
        {24.340635, 55.477802}, {24.221663, 55.692266},
        {24.195968, 55.682879}, {24.196066, 55.679534}, {24.197910, 55.678712}, {24.198966, 55.677567}, {24.199936, 55.677314}, {24.200635, 55.677801}};
public static String[] BldNames = {"Saih Bin Ammar Hostel", "Kowaitat Hostel", "Markhaniah Hostel",
        "F3 Building", "F1 Building/The labs", "CIT Building",
        "H4 Building", "Crescent Building",
        "H2/H3 Buildings", "User Current Location"};

//1.jdbc driver name
private static String SQL_JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
// 2. Database URL, V_UDAY\FRAMEWORK is ServerName and JSF is DataBase name
private static String URL
        = "jdbc:sqlserver://NCMSVTRNSDB.aa.uaeu.ac.ae;databaseName=busTable";
//3.Database credentials
private static String USERNAME = "username";//UserName
private static String PASSWORD = "pass";//Password
public static String[] arr;
public static Connection getLocalConnection(double cLat,double cLon) {
    //   PrintWriter writer = new PrintWriter("l.txt");
    Statement stmt = null;
    try {
        Class.forName(SQL_JDBC_DRIVER);// Register jdbc driver
        //4. open a connection
        connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        stmt = connection.createStatement();
        String sql;
        sql = "Select ID, NAME, DT_UPDATE,LON,LAT From mobile";
        ResultSet rs = stmt.executeQuery(sql);
        //STEP 5: Extract data from result set
        String result = "";
        busList = new String[128];//
        int i = 0;
        double dist;
        double l,l2;
        while (rs.next()) {
            //Retrieve by column name
            String id = rs.getString("ID");
            String name = rs.getString("NAME");
            String first = rs.getString("DT_UPDATE");
            String lat = rs.getString("LAT");
            String lon = rs.getString("LON");
            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
            String current = sdf.format(c.getTime());
            if (isCurrent(first) == true) {
                if (name.contains("Hyundai") || name.contains("Coaster")) {
                    result = "Bus:" + name + "\nTime:" + first + "\n" + calcTime(first, current);
                    l = Double.parseDouble(lat);
                    l2 = Double.parseDouble(lon);
                    dist = calcDist(cLat, cLon, l, l2);
                    result += "\nDistance: " + dist;
                    result += "\nClosest Building: " + closestBldg(l, l2);
                    result += "\n On/Off Campus: " + onOffCampus(l, l2);
                    busList[i] = result;
                }
                i++;
            }
            else{
                result = "Bus:" + name + "\nTime:" + first + "\n" + calcTime(first, current);
                l = Double.parseDouble(lat);
                l2 = Double.parseDouble(lon);
                dist = calcDist(24.197910, 55.678712, l, l2);
                result += "\nDistance: " + dist;
                result += "\nClosest Building: " + closestBldg(l, l2);
                result += "\n Om/Off Campus: " + onOffCampus(l, l2);
                busList[i] = result;
            }
        }
        //STEP 6: Clean-up environment
        rs.close();
        stmt.close();

        setConnectionClose();
        System.out.println("Database Connection Closed");
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("Exception in getLocalConeection() " + e.getMessage());
    }
    return connection;
}

public static void setConnectionClose() throws SQLException {
    if (connection != null) {
        connection.close();
    }
}
public static boolean isCurrent(String busTime) {
    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
    String current = sdf.format(c.getTime());
    Date d1 = null;
    Date d2 = null;

    try {
        d1 = sdf.parse(current);
        d2 = sdf.parse(busTime);

        //in milliseconds
        long diff = d1.getTime() - d2.getTime();

        long diffSeconds = diff / 1000 % 60;
        long diffMinutes = diff / (60 * 1000) % 60;
        long diffHours = diff / (60 * 60 * 1000) % 24;
        long diffDays = diff / (24 * 60 * 60 * 1000);

        if (diffDays == 0 && diffHours <= 1 && (diffMinutes <= 59 && diffMinutes >= 0) && diffSeconds >= 0) {
            return true;
        } else {
            return false;
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return true;
}
public static String[] getBusList(){
    return busList;
}
public static double calcDist(double lat1, double lon1, double lat2, double lon2) {
    double R = 6371000;
    double theta1 = Math.toRadians(lat1);
    double theta2 = Math.toRadians(lat2);
    double thetaDiff = Math.toRadians(theta2 - theta1);
    double lambdaDiff = Math.toRadians(lon2 - lon1);
    double a = Math.pow(Math.sin(thetaDiff / 2),2)
            + Math.cos(theta1) * Math.cos(theta2)
            * Math.sin(lambdaDiff / 2) * Math.pow(Math.sin(lambdaDiff / 2),2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    double d = R * c;
    return d;
}

public static String calcTime(String time1, String time2) throws ParseException {
    String result;
    SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
    Date date1 = null,date2=null;
    try {
        date1 = format.parse(time1);
        date2 = format.parse(time2);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    long diff = date2.getTime() - date1.getTime();
    long secs = diff / 1000 % 60;
    long mins = diff / (60 * 1000) % 60;
    long hrs = diff / (60 * 60 * 1000) % 24;
    long days = diff / (24 * 60 * 60 * 1000);
    if (hrs > 0 && mins > 0 && secs >= 0) {
        result = "ETA: " + hrs + " Hours, " + mins + " Minutes" + " and " + secs + " Seconds";
    } else if (mins > 0 && secs >= 0) {
        result = "ETA: " + mins + " Minutes" + " and " + secs + " Seconds";
    } else if (secs >= 0.01) {
        result = "ETA: " + secs + " Seconds";
    } else {
        result = "ETA: " + "The bus should be here";
    }
    return result;
}


public static String onOffCampus(double busLat, double busLon) {
    double uniLat1 = 24.197690, uniLon1 = 55.677708;
    double uniLat2 = 24.198316, uniLon2 = 55.685948;
    double distToUni1 = calcDist(uniLat1, uniLon1, busLat, busLon);
    System.out.println(distToUni1);

    double distToUni2 = calcDist(uniLat2, uniLon2, busLat, busLon);
    System.out.println(distToUni2);
    if (distToUni1 <= 0.639822725733094 || distToUni2 <= 0.588121032252993) {
        return "On";
    }
    return "Off";
}
public static String closestBldg(double busLat, double busLon) {
    double dist, lat1, lon1, min;
    int mi = 0;
    lat1 = locCoords[0][0];
    lon1 = locCoords[0][1];
    min = calcDist(lat1, lon1, busLat, busLon);

    for (int k = 1; k < locCoords.length; k++) {

        lat1 = locCoords[k][0];
        lon1 = locCoords[k][1];
        dist = calcDist(lat1, lon1, busLat, busLon);
        if (dist < min) {
            min = dist;
            mi = k;
        }
    }

    return BldNames[mi];
}
public void populateListView(){

    //build adapter
    ArrayAdapter<String> adapter;
    adapter = new ArrayAdapter<>(this, R.layout.activity_show_results, busList);

    //config the list view
    ListView list = (ListView) findViewById(R.id.listView5);
    list.setAdapter(adapter);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle b = getIntent().getExtras();
    if (b != null) {
        if (b.containsKey("lat1")) {
            lat = b.getDouble("lat1");
        }
        if (b.containsKey("lon1")) {
            lon = b.getDouble("lon1");
        }}
    else{
        lat = 24.197910;
        lon=55.678712;
    }
    getIntent().removeExtra("lat1");
    getIntent().removeExtra("lon1");
    getLocalConnection(lat,lon);
    populateListView();
 }
 }

Activity ShowResults XML: activity_show_results.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="ae.ac.uaeu.bustrackerapp.ShowResults">

<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/listView5"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />
 </RelativeLayout>

XML for TextView: dat_item.xml

<?xml version="1.0" encoding="utf-8"?>
<!--  Single List Item Design -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/label"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip"
android:textSize="16dip"
android:textStyle="bold" >
</TextView>

我确信每当我调用它时,busList 都是空的,并尝试修复它,但无法修复。 这是最有可能导致我的 NullPointerExcpetion 的原因,但不知道是什么导致了 RuntimeException 这是崩溃报告:

         --------- beginning of crash
05-16 21:09:15.373    1927-1927/ae.ac.uaeu.bustrackerapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: ae.ac.uaeu.bustrackerapp, PID: 1927
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ae.ac.uaeu.bustrackerapp/ae.ac.uaeu.bustrackerapp.ShowResults}: java.lang.NullPointerException: storage == null
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: java.lang.NullPointerException: storage == null
            at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
            at java.util.Arrays.asList(Arrays.java:155)
            at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
            at ae.ac.uaeu.bustrackerapp.ShowResults.populateListView(ShowResults.java:235)
            at ae.ac.uaeu.bustrackerapp.ShowResults.onCreate(ShowResults.java:260)
            at android.app.Activity.performCreate(Activity.java:5933)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

感谢任何帮助/建议/反馈

最佳答案

您应该调用 populateListView();方法,当你完成填充busList时,如果没有,这个可能是null。您应该将其放在 getLocalConnection 方法的末尾。

也改变

public void populateListView(){

   ArrayAdapter<String> adapter= new ArrayAdapter<>(this, R.layout.dat_item, busList);

   //config the list view
   ListView list = (ListView) findViewById(R.id.listView5);
   list.setAdapter(adapter);

}

 @Override
  protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_show_results);
      //All your stuff here
    }

我测试了上面的代码并且它有效,我认为你的listView为空的原因是因为busList为空。 以下是在我的测试中起作用的 populateListView() 中的代码。

public void populateListView() {
    busList = new String[2];
    busList[0] = "test";
    busList[1] = "test1";

    // build adapter
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.dat_item, busList);

    // config the list view
    ListView list = (ListView) findViewById(R.id.listView5);
    list.setAdapter(adapter);
}

关于java - Android - NullPointerException 和 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279309/

相关文章:

mysql - 一对多sequelizejs ORM未能得到结果

mysql - 表主唯一索引作为两列?

java - Apache http 客户端 -> 本地地址绑定(bind) -> 一段时间后发生 BindException

java - EL 中的异或 (XOR)

android - 如何在 Android 上获取我的名片/ID?

android - 使用指定的发件人地址通过 Intent 发送电子邮件

java - 使用 SpringMVC 基于注解的配置进行阐述

java - Tomcat 8 Docx4j 应用问题

Android MediaPlayer 流缓冲

mysql - 从表中选择具有最新时间戳的行的 JOOQ 代码