Reputation: 97
I have two classes, MainActivity and HjorthClass.
I have a nullpointer exception which I believe is coming from my arrays, but I cannot figure out where the error is.
Please direct your attention to TestSeizureDetected() in MainActivity. This issue occurs when I push a button that calls that method. I did not include String huge, because it includes 7681 separate numbers.
The basic format format of
String huge = "1.3870574e+01 2.0512821e+01 3.8485958e+01 4.9816850e+01 6.7789988e+01 6.7789988e+01 6.5836386e+01 7.7557998e+01 8.2246642e+01"
Please see below MainActivity, HjorthClass, and the relevant LogCat when the error appears.
MainActivity
package com.example.android.BluetoothChat;
import android.R.string;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.telephony.SmsManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Locale;
import java.util.Set;
import android.bluetooth.BluetoothDevice;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import android.bluetooth.BluetoothSocket;
import android.widget.EditText;
import java.io.IOException;
import java.util.UUID;
public class MainActivity extends Activity implements LocationListener{
Button start, stop;
Button textData;
TextView tv;
TextView tv2;
TextView sum;
TextView textResult;
LocationManager lm;
static TextToSpeech Talker;
TextView myLabel;
Handler mhandler = new Handler();
int i;
int sum1 = 0;
static BluetoothDevice mmDevice;
static BluetoothAdapter mBluetoothAdapter;
static BluetoothSocket mmSocket;
String lat;
String lon;
public MyCounter timer;
public double[][] finalSeizureData= new double[7681][1];
EditText myTextbox;
static OutputStream mmOutputStream;
static InputStream mmInputStream;
static Thread workerThread;
static byte[] readBuffer;
static int readBufferPosition;
static int counter;
static volatile boolean stopWorker;
TextToSpeech talker;
public HjorthClass testValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
setTitle("Seizure Detection Helmet Application");
myTextbox = (EditText)this.findViewById(R.id.name);
talker = new TextToSpeech(getApplicationContext(),new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR)
{
talker.setLanguage(Locale.US);
}
}
});
//if(BluetoothChat.finalValue.returnSum()== true)//TRYING TO USE THE VALUE FROM BLUETOOTH CHAT HERE! ERROR HERE, finalValue cannot be resolved to this variable.
//{
//SeizureDetected();
//}
//Initialize Counter Sequence
start = (Button)findViewById(R.id.start);// Launch seishor Sequence
stop = (Button)findViewById(R.id.stop);//Override Function
textData =(Button)findViewById(R.id.talk);
tv = (TextView)findViewById(R.id.tv);
tv.setText("30"); // starting from 30.
sum = (TextView)findViewById(R.id.sum);
myLabel = (TextView)findViewById(R.id.result);
textResult = (TextView)findViewById(R.id.TextSeizure);
final MyCounter timer = new MyCounter(30000,1000);
final Runnable sumTask = new Runnable()
{
@Override
public void run()
{
i++;
sum1 = sum1+i;
if(sum1>120)
{
start.setEnabled(true);
timer.start();
return;
}
sum.setText("Sum:"+sum1);
mhandler.postDelayed(this,1000);
}
};
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v){
start.setEnabled(false);
timer.start();
speakOut();
}
});
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
timer.cancel();
tv.setText("Emergency Call to first responders prevented");
}
});
textData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v){
TestSeizureDetected();
}
});
//Initialize GPS layout
tv2 = (TextView) findViewById(R.id.GPS);
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this);
}
public class MyCounter extends CountDownTimer{
public MyCounter(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
System.out.println("Timer Completed.");
tv.setText("Sending information to first responders.");
String name = myTextbox.getText().toString();
String textMessage = "Hello my name is "+ name + " Help I need help, I have tonic clonic seizures at latitudinal coordinates " + lat + " and longitudinal coordinates "+ lon;
String phoneNumber = "7034004407";
SmsManager.getDefault().sendTextMessage(phoneNumber, null, textMessage, null, null);
//phone.setData(Uri.parse("tel:7034004407"));
//startActivity(phone);
}
@Override
public void onTick(long millisUntilFinished) {
tv.setText((millisUntilFinished/1000)+"");
System.out.println("Timer : " + (millisUntilFinished/1000));
}
}
@Override
public void onLocationChanged(Location arg0)
{
lat = String.valueOf(arg0.getLatitude());
lon = String.valueOf(arg0.getLongitude());
Log.e("GPS", "location changed: lat="+lat+", lon="+lon);
tv2.setText("lat="+lat+", long="+lon);
}
public void onProviderDisabled(String arg0) {
Log.e("GPS", "provider disabled " + arg0);
}
public void onProviderEnabled(String arg0) {
Log.e("GPS", "provider enabled " + arg0);
}
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
Log.e("GPS", "status changed to " + arg0 + " [" + arg1 + "]");
}
public void SeizureDetected()
{
timer.start();
speakOut();
}
public void TestSeizureDetected()
{
String[] temp = huge.split("\\s+");
double[] convert = new double[temp.length];
for(int y = 0; y<convert.length; y++)
{
convert[y]= Double.parseDouble(temp[y]);
}
for(int i = 0; i<convert.length;i++)
{
for(int j = 0; j<1;j++)
{
finalSeizureData[i][j] = convert[j];
}
}
testValue = new HjorthClass(finalSeizureData);
if(testValue.returnSum()== true)
{
textResult.setText("Seizure has been detected in Text File");
}
}
public void speakOut()
{
String original = ("You will have a seizure in thirty seconds. You will have a seizure shortly. Please arrange yourself in a safe position. You will have a seizure shortly. Please arrange yourself in a safe position. You will have a seizure shortly. Please arrange yourself in a safe position. You will have a seish shortly. Please arrange yourself in a safe position.");
talker.speak(original, TextToSpeech.QUEUE_FLUSH, null);
}
}
HjorthClass
package com.example.android.BluetoothChat;
import android.app.Activity;
public class HjorthClass extends Activity{
public double [][]Active;
public int height;
public int width;
public double [][] d1;
public double [][] d2;
public double [][] m0;
public double [][] threshold;
public double sum;
//check length of height
public HjorthClass (double [][]Active)
{
height = Active[0].length;
width = Active[1].length;
for(int i = 0; i<height; i++)// 1st differential subtracting from previous row
{
if(i == 0)
{
d1[0][0] = Active[0][0];
}
else
{
for(int j =0; j < width; j++)
{
d1[i][j] = Active[i][j]-Active[i-1][j];
}
}
}
for(int i = 0; i<d1[0].length; i++)// 2nd differential subtracting from the row before
{
if(i == 0)
{
d2[0][0] = d1[0][0]; //since no previous row -- the difference between the previous row(non-existant) and this row is assumed to be this value
}
else
{
for(int j =0; j <width; j++)
{
d2[i][j] = d1[i][j]- d1[i-1][j];
}
}
}
for(int i = 0; i<height; i++)// Original moving average - is used for Activity
{
if(i == 0)
{
m0[0][0] = Active[i][i]/2;
}
else
{
for(int j =0; j < width; j++)
{
m0[i][j] = (Active[i][j]- Active[i-1][j])/2;
}
}
}
for(int i = 0; i<m0[0].length; i++)// Threshold, if the value is of the moving average at each data point is greater than 10,000, program outputs 1, otherwise 0
{
for(int j =0; j < width; j++)
{
if(m0[i][j] >= 10000 )
{
threshold[i][j] = 1;
}
else
{
threshold[i][j]=0;
}
}
}
for(int i = 0; i<threshold[0].length; i++)// Sum of all the values
{
for(int j =0; j < width; j++)
{
sum = sum + threshold[i][j];
}
}
}
public boolean returnSum()
{
if(sum >= 300)
{
return true;
}
else
return false;
}
}
LogCat
04-01 17:59:00.836: D/dalvikvm(3506): GC_CONCURRENT freed 90K, 38% free 4146K/6663K, external 2002K/2137K, paused 9ms+2ms
04-01 17:59:01.176: D/dalvikvm(3506): GC_CONCURRENT freed 323K, 36% free 4994K/7751K, external 2002K/2137K, paused 3ms+2ms
04-01 17:59:01.466: D/dalvikvm(3506): GC_CONCURRENT freed 1513K, 45% free 4956K/8903K, external 2002K/2137K, paused 2ms+4ms
04-01 17:59:01.486: D/AndroidRuntime(3506): Shutting down VM
04-01 17:59:01.486: W/dalvikvm(3506): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-01 17:59:01.496: E/AndroidRuntime(3506): FATAL EXCEPTION: main
04-01 17:59:01.496: E/AndroidRuntime(3506): java.lang.NullPointerException
04-01 17:59:01.496: E/AndroidRuntime(3506): at com.example.android.BluetoothChat.HjorthClass.<init>(HjorthClass.java:27)
04-01 17:59:01.496: E/AndroidRuntime(3506): at com.example.android.BluetoothChat.MainActivity.TestSeizureDetected(MainActivity.java:236)
04-01 17:59:01.496: E/AndroidRuntime(3506): at com.example.android.BluetoothChat.MainActivity$5.onClick(MainActivity.java:154)
04-01 17:59:01.496: E/AndroidRuntime(3506): at android.view.View.performClick(View.java:2485)
04-01 17:59:01.496: E/AndroidRuntime(3506): at android.view.View$PerformClick.run(View.java:9080)
04-01 17:59:01.496: E/AndroidRuntime(3506): at android.os.Handler.handleCallback(Handler.java:587)
04-01 17:59:01.496: E/AndroidRuntime(3506): at android.os.Handler.dispatchMessage(Handler.java:92)
04-01 17:59:01.496: E/AndroidRuntime(3506): at android.os.Looper.loop(Looper.java:130)
04-01 17:59:01.496: E/AndroidRuntime(3506): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-01 17:59:01.496: E/AndroidRuntime(3506): at java.lang.reflect.Method.invokeNative(Native Method)
04-01 17:59:01.496: E/AndroidRuntime(3506): at java.lang.reflect.Method.invoke(Method.java:507)
04-01 17:59:01.496: E/AndroidRuntime(3506): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-01 17:59:01.496: E/AndroidRuntime(3506): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-01 17:59:01.496: E/AndroidRuntime(3506): at dalvik.system.NativeStart.main(Native Method)
04-01 17:59:23.046: I/Process(3506): Sending signal. PID: 3506 SIG: 9
Upvotes: 0
Views: 119
Reputation: 805
It looks like you are setting finalSeizureData (a double array) to covert (a single array). i.e. new double[7681][1] = new double[temp.length]. So I think your variable finalSeizureData will always contain 1 single array. You are not setting the arrays properly. I might have to write a quick test case...
Upvotes: 0
Reputation: 11234
Before trying to access any values inside d1
,d2
,m0
or threshold
arrays you should initialize them. I can be mistaken regarding the needed size, but you can try the following
public HjorthClass (double [][]Active)
{
height = Active[0].length;
width = Active[1].length;
d1 = new double[height][width];
d2 = new double[height][width];
....
But you also may want to use ArrayList<ArrayList<Double>>
for keeping the data if you don't know the size of structure you'll be working with.
Upvotes: 1
Reputation: 11948
you don't initialize d1
and d2
, you need initialize that before using on HjorthClass
Upvotes: 1