Android - NullPointerException&的RuntimeException

时间:2015-05-16 18:31:54

标签: java android mysql jdbc

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

  1. RuntimeException:不确定是什么导致此
  2. NullPointerException:由于busList数组返回空
  3. 这是我的代码:

      

    活动: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();
     }
     }
    
      

    活动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>
    
      

    TextView的XML: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) 
    

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

1 个答案:

答案 0 :(得分:0)

你应该调用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);
}