Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

method does not override or implement a method from a supertype - for Override

Tags:

java

android

I have looked all around but can't figure out why I'm getting the error

error: method does not override or implement a method from a supertype

This highlights the two @Overrides I have in a method (subroutine?). Here's my MainActivity.java - the part of the code it occurs in the queryBooks() method at the end - the @Overrides are both underlined red.

package com.example.batman.myapplication;  import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.support.v4.view.MenuItemCompat; //import android.support.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.ShareActionProvider; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast;   import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.JsonHttpResponseHandler;  import org.json.JSONObject;  import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList;  public class MainActivity extends AppCompatActivity implements View.OnClickListener, AdapterView.OnItemClickListener {     TextView mainTextView;     EditText mainEditText;     ListView mainListView;     ArrayAdapter mArrayAdapter; //  ArrayList<String> mNameList = new ArrayList<String>();     ArrayList mNameList = new ArrayList();     android.support.v7.widget.ShareActionProvider mShareActionProvider;      // This is for internet stuff     private static final String QUERY_URL = "http://openlibrary.org/search.json?q=";       // Setting up the storage of data     private static final String PREFS = "prefs";     private static final String PREF_NAME = "name";     SharedPreferences mSharedPreferences;        @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         // 1. Access the TextView defined in layout XML         // and then set its text         mainTextView = (TextView) findViewById(R.id.main_textview); //      mainTextView.setText("Set in Java!");          Button mainButton;         mainButton = (Button) findViewById(R.id.main_button);         mainButton.setOnClickListener(this);          // 3.  Access the EditText defined in layout XML         mainEditText = (EditText) findViewById(R.id.main_edittext);          // 4. Access the ListView         mainListView = (ListView) findViewById(R.id.main_listview);         // Create an ArrayAdapter for the ListView         mArrayAdapter = new ArrayAdapter(this,                 android.R.layout.simple_list_item_1,                 mNameList);         // Set the ListView to use the ArrayAdapter         mainListView.setAdapter(mArrayAdapter);          // 5. Set this activity to react to list items being pressed         mainListView.setOnItemClickListener(this);          // 7. Greet the user, or ask for their name if new         displayWelcome();     }      @Override     public boolean onCreateOptionsMenu(Menu menu) {          // Inflate the menu.         // Adds items to the action bar if it is present.         getMenuInflater().inflate(R.menu.menu_main, menu);          // Access the Share Item defined in menu XML         MenuItem shareItem = menu.findItem(R.id.menu_item_share);          // Access the object responsible for         // putting together the sharing submenu         if (shareItem != null) {             mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);         }          // Create an Intent to share your content         setShareIntent();          return true;     }      private void setShareIntent() {          if (mShareActionProvider != null) {              // create an Intent with the contents of the TextView             Intent shareIntent = new Intent(Intent.ACTION_SEND);             shareIntent.setType("text/plain");             shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Android Development");             shareIntent.putExtra(Intent.EXTRA_TEXT, mainTextView.getText());              // Make sure the provider knows             // it should work with that Intent             mShareActionProvider.setShareIntent(shareIntent);         }     }      @Override     public void onClick(View v) { //      // Take what was typed into the EditText //      // and use in TextView //      mainTextView.setText(mainEditText.getText().toString() + "."); // //      // Also add that value to the list shown in the ListView //      mNameList.add(mainEditText.getText().toString()); //      mArrayAdapter.notifyDataSetChanged(); //      // 6. The text you'd like to share has changed, //      // and you need to update //      setShareIntent(); // //      if(v == mainEditText) { //          mainEditText.setText(""); //      }          // 9. Take what was typed into the EditText and use in search         // (the above is commented out, per tutorial part 3 - this takes its place as input         queryBooks(mainEditText.getText().toString()); //      mainEditText.setText("");     }      @Override     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {          // Log the item's position and contents         // to the console in Debug         Log.d("My Application", position + ": " + mNameList.get(position));     }      public void displayWelcome() {          // Access the device's key-value storage         mSharedPreferences = getSharedPreferences(PREFS, MODE_PRIVATE);          // Read the user's name,         // or an empty string if nothing found         String name = mSharedPreferences.getString(PREF_NAME, "");          if (name.length() > 0) {              // If the name is valid, display a Toast welcoming them             Toast.makeText(this, "Welcome back, " + name + "!", Toast.LENGTH_LONG).show();         } else {              // otherwise, show a dialog to ask for their name             AlertDialog.Builder alert = new AlertDialog.Builder(this);             alert.setTitle("Hello!");             alert.setMessage("What is your name?");              // Create EditText for entry             final EditText input = new EditText(this);             alert.setView(input);              // Make an "OK" button to save the name             alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {                  public void onClick(DialogInterface dialog, int whichButton) {                      // Grab the EditText's input                     String inputName = input.getText().toString();                      // Put it into memory (don't forget to commit!)                     SharedPreferences.Editor e = mSharedPreferences.edit();                     e.putString(PREF_NAME, inputName);                     e.commit();                      // Welcome the new user                     Toast.makeText(getApplicationContext(), "Welcome, " + inputName + "!", Toast.LENGTH_LONG).show();                 }             });         // Make a "Cancel" button         // that simply dismisses the alert                     alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {                          public void onClick(DialogInterface dialog, int whichButton) {}                     });              alert.show();     }     }      // Internet stuff     private void queryBooks(String searchString) {          // Prepare your search string to be put in a URL         // It might have reserved characters or something         String urlString = "";         try {             urlString = URLEncoder.encode(searchString, "UTF-8");         } catch (UnsupportedEncodingException e) {              // if this fails for some reason, let the user know why             e.printStackTrace();             Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();         }          // Create a client to perform networking         AsyncHttpClient client = new AsyncHttpClient();          // Have the client get a JSONArray of data         // and define how to respond         client.get(QUERY_URL + urlString,                 new JsonHttpResponseHandler() {                      @Override // THIS METHOD DOES NOT OVERRIDE METHOD FROM ITS SUPERCLASS ??                     public void onSuccess(JSONObject jsonObject) {                         // Display a "Toast" message                         // to announce your success                         Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();                          // 8. For now, just log results                         Log.d("omg android", jsonObject.toString());                     }                      @Override // THIS METHOD DOES NOT OVERRIDE METHOD FROM ITS SUPERCLASS ??                     public void onFailure(int statusCode, Throwable throwable, JSONObject error) {                         // Display a "Toast" message                         // to announce the failure                         Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show();                          // Log error message                         // to help solve any problems                         Log.e("omg android", statusCode + " " + throwable.getMessage());                     }                 });     } } // end class 

(For what it's worth, I'm following this tutorial).

Thanks for any thoughts!

like image 433
BruceWayne Avatar asked Aug 26 '15 03:08

BruceWayne


People also ask

Which method overrides a method in the superclass?

An instance method in a subclass with the same signature (name, plus the number and the type of its parameters) and return type as an instance method in the superclass overrides the superclass's method.

What happens if @override is not used Java?

While it is not required to use this annotation when overriding a method, it helps to prevent errors. If a method marked with @Override fails to correctly override a method in one of its superclasses, the compiler generates an error.

What is @override in Java?

The @Override annotation indicates that the child class method is over-writing its base class method. The @Override annotation can be useful for two reasons. It extracts a warning from the compiler if the annotated method doesn't actually override anything. It can improve the readability of the source code.

What is overriding method in inheritance?

The subclass inherits the attributes and methods of the superclass. Now, if the same method is defined in both the superclass and the subclass, then the method of the subclass class overrides the method of the superclass. This is known as method overriding.


1 Answers

The problem is what the error message is saying: "the method does not override or implement a method from a supertype". You annotated both methods with the Override annotation, however, no method with the same signature (i.e. the parameters) can be found in the supertype (JsonHttpResponseHandler).

If you take a look at the documentation of JsonHttpResponseHandler, you can see all the available onSuccess(...) and onFailure(...) methods.

Here is the working version of your code (note that changes in the method signatures):

client.get(QUERY_URL + urlString,     new JsonHttpResponseHandler() {          @Override         public void onSuccess(int statusCode, org.apache.http.Header[] headers, JSONObject jsonObject) {             // Display a "Toast" message             // to announce your success             Toast.makeText(getApplicationContext(), "Success!", Toast.LENGTH_LONG).show();              // 8. For now, just log results             Log.d("omg android", jsonObject.toString());         }          @Override         public void onFailure(int statusCode, org.apache.http.Header[] headers, Throwable throwable, JSONObject error) {             // Display a "Toast" message             // to announce the failure             Toast.makeText(getApplicationContext(), "Error: " + statusCode + " " + throwable.getMessage(), Toast.LENGTH_LONG).show();              // Log error message             // to help solve any problems             Log.e("omg android", statusCode + " " + throwable.getMessage());         }     }); 

Note that starting from Android 6.0 (API level 23) the Apache library (org.apache.http.*) is not available anymore. If you want to continue using that, see Behavior Changes for more information.

Some personal opinion: I wouldn't recommend using the Asynchronous HTTP Library as it's built on top of the obsolete (and from API level 23, removed) Apache HttpClient, which has poor performance compared to HttpURLConnection. Quote from the Android developers about HttpURLConnection:

This API is more efficient because it reduces network use through transparent compression and response caching, and minimizes power consumption.

like image 115
Gergely Kőrössy Avatar answered Sep 22 '22 00:09

Gergely Kőrössy