GVKun编程网logo

Java笔记之java.lang.String#trim(java lang.string)

23

对于想了解Java笔记之java.lang.String#trim的读者,本文将提供新的信息,我们将详细介绍javalang.string,并且为您提供关于Androidstudio不兼容的类型需要j

对于想了解Java笔记之java.lang.String#trim的读者,本文将提供新的信息,我们将详细介绍java lang.string,并且为您提供关于Android studio不兼容的类型需要java.lang.String找到java.lang.String、Android:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”、ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、herbetr 遇到 Cannot cast java.lang.Character to java.lang.Stringat java.lang.Class.cast的有价值信息。

本文目录一览:

Java笔记之java.lang.String#trim(java lang.string)

Java笔记之java.lang.String#trim(java lang.string)

 

String的trim()方法是使用频率频率很高的一个方法,直到不久前我不确定trim去除两端的空白符时对换行符是怎么处理的点进去看了下源码的实现,才发现String#trim的实现跟我想像的完全不一样,原来一直以来我对这个函数存在着很深的误解。

我想的trim方法是类似于下面这样的:

package cc11001100.trimStudy;

/**
 * @author CC11001100
 */
public class CustomString {

	private char[] values;

	public CustomString(char[] values) {
		this.values = values;
	}

	// ...

	public CustomString trim() {
		char[] localValues = values;
		int left = 0, right = localValues.length;
		while (left < right && isBlankChar(localValues[left])) {
			left++;
		}
		while (right > left && isBlankChar(localValues[right - 1])) {
			right--;
		}
		if (left != 0 || right != localValues.length) {
			char[] newValue = new char[right - left];
			System.arraycopy(localValues, left, newValue, 0, newValue.length);
			return new CustomString(newValue);
		} else {
			return this;
		}
	}

	private boolean isBlankChar(char c) {
		return c == '' '' || c == ''\t'' || c == ''\r'' || c == ''\n'';
	}

	@Override
	public String toString() {
		return new java.lang.String(values);
	}

	// ...

}

即去除字符串两边的回车换行、制表符、回车换行符等等,然而String#trim的实际实现是这样的:

/**
 * Returns a string whose value is this string, with any leading and trailing
 * whitespace removed.
 * <p>
 * If this {@code String} object represents an empty character
 * sequence, or the first and last characters of character sequence
 * represented by this {@code String} object both have codes
 * greater than {@code ''\u005Cu0020''} (the space character), then a
 * reference to this {@code String} object is returned.
 * <p>
 * Otherwise, if there is no character with a code greater than
 * {@code ''\u005Cu0020''} in the string, then a
 * {@code String} object representing an empty string is
 * returned.
 * <p>
 * Otherwise, let <i>k</i> be the index of the first character in the
 * string whose code is greater than {@code ''\u005Cu0020''}, and let
 * <i>m</i> be the index of the last character in the string whose code
 * is greater than {@code ''\u005Cu0020''}. A {@code String}
 * object is returned, representing the substring of this string that
 * begins with the character at index <i>k</i> and ends with the
 * character at index <i>m</i>-that is, the result of
 * {@code this.substring(k, m + 1)}.
 * <p>
 * This method may be used to trim whitespace (as defined above) from
 * the beginning and end of a string.
 *
 * @return  A string whose value is this string, with any leading and trailing white
 *          space removed, or this string if it has no leading or
 *          trailing white space.
 */
public String trim() {
    int len = value.length;
    int st = 0;
    char[] val = value;    /* avoid getfield opcode */

    while ((st < len) && (val[st] <= '' '')) {
        st++;
    }
    while ((st < len) && (val[len - 1] <= '' '')) {
        len--;
    }
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}

会将字符串两侧小于空格的字符都去除掉,这里可以简单的将\u005Cu0020理解为ASCII 0x20,即十进制的32,在ASCII码表中小于等于32的字符都将被去除:

image 

先来看一下trim必须要去除的几个字符:

\t是9

\r是13

\n是10

这几个字符倒是都小于空格,而且前31位都是不可见字符,32是空格,这样做的话好像也没有太大的毛病,只是以后再使用trim的时候要想一下自己的数据有没有可能出现小于32不是空格制表符换行之类又需要保留的。

 

下面是对String#trim的一个简单测试:

package cc11001100.trimStudy;

/**
 * @author CC11001100
 */
public class TrimStudy {

	public static void main(String[] args) {

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < 128; i++) {
			sb.append((char) i);
		}
		String s = sb.toString().trim();
		// trim效果
		System.out.println("-" + s + "-");
		// trim之后第一个字符的ASCII码
		System.out.println((int) s.charAt(0));
		// 删除
		System.out.println((char) 127);
		// 查看其它空白字符的打印效果
		System.out.println(sb.toString());

	}

}

运行结果:
image 

注意ASCII 127删除字符应该也可以算作是不可见的空白字符。

 

后来我不死心,又去找了被依赖超多次数的Apache commons-lang中StringUtils#trim的实现:

/**
 * <p>Removes control characters (char &lt;= 32) from both
 * ends of this String, handling <code>null</code> by returning
 * <code>null</code>.</p>
 *
 * <p>The String is trimmed using {@link String#trim()}.
 * Trim removes start and end characters &lt;= 32.
 * To strip whitespace use {@link #strip(String)}.</p>
 *
 * <p>To trim your choice of characters, use the
 * {@link #strip(String, String)} methods.</p>
 *
 * <pre>
 * StringUtils.trim(null)          = null
 * StringUtils.trim("")            = ""
 * StringUtils.trim("     ")       = ""
 * StringUtils.trim("abc")         = "abc"
 * StringUtils.trim("    abc    ") = "abc"
 * </pre>
 *
 * @param str  the String to be trimmed, may be null
 * @return the trimmed string, <code>null</code> if null String input
 */
public static String trim(String str) {
    return str == null ? null : str.trim();
}

然而也只是调用了String#trim,也不是我想象的那样….

 

看来我一直以来都对trim有着很深的误解,trim是编程中对字符串处理的一个比较通用的概念,也不知道其它语言的具体实现是怎样的。

 

.

Android studio不兼容的类型需要java.lang.String找到java.lang.String

Android studio不兼容的类型需要java.lang.String找到java.lang.String

在更新我的 Android Studio和Java之后,我在一个简单的语句中得到了上述错误:
String s = "";

看起来Android Studio无法找到我的Java.

我使用Gradle(来自Android Studio内部)在Windows 7(64位)上构建我的项目.

我也得到这个错误:

@Override,not applicable to method

使用我的方法:@Override

您可以在Github上查看项目,它可以在我的其他计算机上运行,​​但不能在我的家用计算机上运行.

谁能帮帮我吗

解决方法

我知道这是旧的,但在我使用Android Studio时机器崩溃后我遇到了同样的问题.解决方案很简单,前往
File > Invalidate Caches & Restart

您的IDE将重新启动,您的JAVA环境将再次正常运行.

Android:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”

Android:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”

面对我正在使用的练习应用程序的问题。我面临与toString方法有关的NullPointerException问题。作为android应用程序开发的新手,即使经过研究,我也不确定确切的原因。因此,我要求一个更熟悉堆栈跟踪的人来帮助我。

注意:当我单击列表视图条目以访问日记条目的编辑页面时,将发生错误。但是,它似乎根本没有进入编辑页面。

在下面,您将找到我的活动代码及其堆栈跟踪。

活动代码:

import android.app.AlertDialog;import android.content.DialogInterface;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.content.Intent;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;public class ViewDiaryEntries extends AppCompatActivity {// Database HelperMyDBHandler db;// ListviewListView data_list;// Test varpublic final static String KEY_EXTRA_DATA_ID = "KEY_EXTRA_DATA_ID";@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_view_diary_entries);    db = new MyDBHandler(this);    // Displays the database items.    displayItems();}// To display items in the listview.public void displayItems(){    // To display items in a listview.    ArrayList db_data_list = db.getDiaryDBDataList();    ArrayAdapter listAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, db_data_list);    // Set the adapter for the listview    data_list = (ListView) findViewById(R.id.dataListView);    data_list.setAdapter(listAdapter);    /* Experiment -------------------------------------------------------------*/    data_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {        @Override        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {            // Selected item store            String selectedEntry = ((TextView) view).getText().toString();            // Test for regular expression            String[] listViewItemSplit = selectedEntry.split(" - ");            String listViewItempt1 = listViewItemSplit[0]; // For date and time            //String listViewItempt2 = listViewItemSplit[1]; // For save file name            //Toast.makeText(ViewDiaryEntries.this, listViewItempt1, Toast.LENGTH_LONG).show();            if(listViewItempt1.equals("")){                Toast.makeText(ViewDiaryEntries.this, "Error. Unable to detect entry ID.", Toast.LENGTH_LONG).show();            }            else{                // Pass on the data:                Intent editEntry = new Intent(ViewDiaryEntries.this, editdiaryentry.class);                editEntry.putExtra(KEY_EXTRA_DATA_ID, listViewItempt1);                startActivity(editEntry);            }        }    });}// For the go back button.public void viewdiarytoinitialdiary_backbutt(View v){    // Create and start new intent going back ot main page.    Intent main_page = new Intent(ViewDiaryEntries.this, User_Main_Menu_Options.class);    main_page.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    startActivity(main_page);}// For the about button.public void viewdiarypage_directionabout_butt(View v){    // Create an alert dialog    final AlertDialog.Builder about_page_dialog = new AlertDialog.Builder(ViewDiaryEntries.this);    about_page_dialog.setTitle("About This Page:");    // Inputs values for the dialog message.    final String dialog_message = "This page will show you any saved diary entries you''ve.\n\n To edit an entry, do the following: \n\n- Take note of the Entry ID# (first value on entry display) \n- Type it in the number box at the bottom. \n- Press Edit Record icon next to number box, and wait for it to load.";    about_page_dialog.setMessage(dialog_message);    about_page_dialog.setPositiveButton("Got it!", new DialogInterface.OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {            // Closes the dialog.            dialog.cancel();        }    });    // Shows the dialog.    about_page_dialog.show();}// Main menu button.public void viewDiaryEntriesMainMenushortcut_butt(View v){    // Creates main menu alert dialog.    AlertDialog.Builder mainMenu_Dialog = new AlertDialog.Builder(this);    mainMenu_Dialog.setIcon(R.drawable.main_menu_symbol);    mainMenu_Dialog.setTitle("Main Menu");    // Creates array adapter with items to fill the menu with.    final ArrayAdapter<String> menuItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);    menuItemsAdapter.add("Home Screen");    menuItemsAdapter.add("Diary");    menuItemsAdapter.add("Tests");    menuItemsAdapter.add("Activity");    menuItemsAdapter.add("Media");    menuItemsAdapter.add("Thought of the Day");    menuItemsAdapter.add("Inspirational Quotes");    menuItemsAdapter.add("Resources");    menuItemsAdapter.add("Settings");    // To close menu.    mainMenu_Dialog.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {            dialog.cancel();        }    });    // To go to appropriate page upon selection.    mainMenu_Dialog.setAdapter(menuItemsAdapter, new DialogInterface.OnClickListener() {        @Override        public void onClick(DialogInterface dialog, int which) {            String selectedItem = menuItemsAdapter.getItem(which);            if(selectedItem.equals("Home Screen")){                // Goes to main menu.                Intent mainMenu = new Intent(ViewDiaryEntries.this, User_Main_Menu_Options.class);                mainMenu.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(mainMenu);            }            else if(selectedItem.equals("Diary")){                // Goes to diary page.                Intent diaryPage = new Intent(ViewDiaryEntries.this, ViewDiaryEntries.class);                diaryPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(diaryPage);            }            else if(selectedItem.equals("Tests")){                // Goes to tests page.                Intent testsPage = new Intent(ViewDiaryEntries.this, TestChoices.class);                testsPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(testsPage);            }            else if(selectedItem.equals("Media")){                // Goes to media page.                Intent mediaPage = new Intent(ViewDiaryEntries.this, initialMediaPage.class);                mediaPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(mediaPage);            }            else if(selectedItem.equals("Thought of the Day")){                // Goes to thought of the day page.                Intent thoughtofthedayPage = new Intent(ViewDiaryEntries.this, thoughtQuotes.class);                thoughtofthedayPage.putExtra("quote_or_thought", 2);                thoughtofthedayPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(thoughtofthedayPage);            }            else if(selectedItem.equals("Inspirational Quotes")){                // Goes to inspirational quotes page.                Intent inspirationalquotesPage = new Intent(ViewDiaryEntries.this, thoughtQuotes.class);                inspirationalquotesPage.putExtra("quote_or_thought", 1);                inspirationalquotesPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(inspirationalquotesPage);            }            else if(selectedItem.equals("Settings")){                // Goes to settings page.                Intent settingsPage = new Intent(ViewDiaryEntries.this, settings.class);                settingsPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);                startActivity(settingsPage);            }        }    });    mainMenu_Dialog.show();}// For the settings button.public void viewdiarypagelisttoSettings_butt(View v){    // Goes to settings page.    Intent settingsPage = new Intent(ViewDiaryEntries.this, settings.class);    settingsPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);    startActivity(settingsPage);}// For new entry.public void viewdiarypageaddEntry_butt(View v){    // Opening up the diary add intent.    Intent newdiaryEntry = new Intent(ViewDiaryEntries.this, newdiaryentry.class);    startActivity(newdiaryEntry);}}

这是我看到的堆栈跟踪:

java.lang.NullPointerException: Attempt to invoke virtual method ''java.lang.String java.lang.Object.toString()'' on a null object reference        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)        at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:194)        at android.widget.Spinner.onMeasure(Spinner.java:580)        at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:407)        at android.view.View.measure(View.java:18794)        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)        at android.view.View.measure(View.java:18794)        at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1283)        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)        at android.widget.ScrollView.onMeasure(ScrollView.java:340)        at android.view.View.measure(View.java:18794)        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)        at android.view.View.measure(View.java:18794)        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)        at android.view.View.measure(View.java:18794)        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)        at android.view.View.measure(View.java:18794)        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)        at android.view.View.measure(View.java:18794)        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)        at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)        at android.view.View.measure(View.java:18794)        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)        at android.view.Choreographer.doCallbacks(Choreographer.java:670)        at android.view.Choreographer.doFrame(Choreographer.java:606)        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)        at android.os.Handler.handleCallback(Handler.java:739)        at android.os.Handler.dispatchMessage(Handler.java:95)        at android.os.Looper.loop(Looper.java:148)        at android.app.ActivityThread.main(ActivityThread.java:5417)        at java.lang.reflect.Method.invoke(Native Method)        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

任何对解决方案的帮助将不胜感激。

编辑:

因此,在从数据库和与之交互的活动之间的代码来回浏览之后,我设法使其重新工作。以下是我按确切顺序执行的操作:

  1. 我意识到我有一个日期字段没有接收任何数据,对此进行了纠正。
  2. 清理了项目。
  3. 重新启动Android Studio(基本上停止开发环境的所有操作)。
  4. 从我的开发手机上卸载了该应用。
  5. 重新启动android studio并重新安装该应用程序。
  6. 我以某种方式工作= _ =,是的,这很神奇。

老实说,我不知道哪一步真正解决了它。我猜这是数据库中的日期字段在我没有收到任何数据的同时给我带来了麻烦。

答案1

小编典典

您的阵列中ArrayAdapter至少包含一个条目null。那里不能有空值。

数组被填充,getDiaryDBDataList()所以问题也在那里。

ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]

错误堆栈:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
    at android.support.v4.util.SimpleArrayMap.allocArrays(SourceFile:183)
    at android.support.v4.util.SimpleArrayMap.put(SourceFile:437)

错误原因:
由于SimpleArrayMap 里面使用了一个静态变量的缓存,mBaseCache,

    static Object[] mBaseCache;

该变量默认有两个数据,第1个元素是一个object[],用于存放上次的缓存的mBaseCache
第二个元素是int[],用于存在hash。具体赋值代码可以看下面

synchronized (ArrayMap.class) {
                if (mBaseCacheSize < CACHE_SIZE) {
                    array[0] = mBaseCache;
                    array[1] = hashes;
                    for (int i=(size<<1)-1; i>=2; i--) {
                        array[i] = null;
                    }
                    mBaseCache = array;
                    mBaseCacheSize++;
                    if (DEBUG) Log.d(TAG, "Storing 1x cache " + array
                            + " now have " + mBaseCacheSize + " entries");
                }
            }

使用该数组的地方在:
SimpleArrayMap 的allocArrays 方法里

synchronized (ArrayMap.class) {
                if (mBaseCache != null) {
                    final Object[] array = mBaseCache;
                    mArray = array;
                    mBaseCache = (Object[])array[0];
                    mHashes = (int[])array[1];
                    array[0] = array[1] = null;
                    mBaseCacheSize--;
                    if (DEBUG) Log.d(TAG, "Retrieving 1x cache " + mHashes
                            + " now have " + mBaseCacheSize + " entries");
                    return;
                }
            }

下面这段代码是有风险的,如果mBaseCache 在多线程被修改了,就会把ClassCastException 异常。

        mBaseCache = (Object[])array[0];

解决方法:
如果项目某个地方报这个错误,请把这个地方的ArrayMap替换成 HasMap. HasMap 多线程不会崩溃,虽然,他不是特别完好的支持。不需要把项目中所有的地方都替换掉,没有必要。单独线程,ArrayMap 完全没有问题。

错误复现:这个复现起来超级麻烦,我花了一周的时间,才找到复现的漏洞,分享给大家:

    /**
     * 复现该问题  用了四个线程
     *     java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]
     *         at android.support.v4.util.SimpleArrayMap.allocArrays(SimpleArrayMap.java:157)
     *         at android.support.v4.util.SimpleArrayMap.put(SimpleArrayMap.java:399)
     *         at com.example.fragment.MainFragment$14.run(MainFragment.java:280)
     *        1.首先 线程1 执行到put 方法的

     *         mArray[index<<1] = key;
     *         mArray[(index<<1)+1] = value;
     *         mSize++;
     *         return null;
     *         最上面这个位置  目的是让这个数组不再是空的
     *
     *         2.执行线程2  也执行到
     *         mArray[index<<1] = key;
     *         mArray[(index<<1)+1] = value;
     *         mSize++;
     *         return null;
     *         最上面这个位置  目的是让这个put 的东西,放在第0个位置,因为put里面会生成index,
     *         让两个线程都放到index 是0 的位置
     *
     *         3.把线程1执行完,这样数据里面已经放进去一个数据了
     *
     *         4.执行线程3 到removeAt 方法的 freeArrays 的  mBaseCache = array; 之前
     *             public V removeAt(int index) {
     *              final Object old = mArray[(index << 1) + 1];
     *              if (mSize <= 1) {
     *             // Now empty.
     *             if (DEBUG) Log.d(TAG, "remove: shrink from " + mHashes.length + " to 0");
     *             freeArrays(mHashes, mArray, mSize);
     *
     *             mBaseCache = array;----------- freeArrays
     *
     *             这个的目的是调用freeArray 方法,让当前的map释放当前的数组。这样就可以生成mBaseCache了
     *
 *             5.把线程2  执行完
 *             这样就会把mBaseCache 赋值的数组,重新赋值
 *
 *             6.把线程3执行完
 *             ok,现在mBaseCache已经被污染了
 *
 *             7.执行线程4
 *
 */
    private void CMETestCastException() {
        final ArrayMap testArrayMap = new ArrayMap();
        final ArrayMap testArrayMap2 = new ArrayMap();

        new  Thread("线程1"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.put("2324","fffff");
            }

        }.start();

        new  Thread("线程2"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.put("test","string");
            }

        }.start();

        new  Thread("线程3"){
            @Override
            public void run() {
                super.run();
                    testArrayMap.removeAt(0);
            }

        }.start();

        new  Thread("线程4"){
            @Override
            public void run() {
                super.run();
                    testArrayMap2.put("aaa","string");
            }

        }.start();
    }

复现这个问题的时候,关键是把mBaseCache 污染掉。这里四个线程的话,需要调试,调试步骤就是上面我注释的。

总结:
如果当前的map 会有多个线程访问,请使用HasMap. 该问题,google 并没有解决。在高版本上,直接扔CME ConcurrentModificationException.

herbetr 遇到 Cannot cast java.lang.Character to java.lang.Stringat java.lang.Class.cast

herbetr 遇到 Cannot cast java.lang.Character to java.lang.Stringat java.lang.Class.cast

sql.append("order by a.T_DATA_DATE desc,a.QUES_SUM desc");
        Query qu= HibernateUtil.currentSession().createSQLQuery(sql.toString())
                .addScalar("ruleCode", Hibernate.STRING)
                .addScalar("ruleId", Hibernate.STRING)
                .addScalar("schdType", Hibernate.STRING)
                .addScalar("chkDate", Hibernate.DATE)
                .addScalar("queType", Hibernate.STRING)
                .addScalar("chkResult", Hibernate.STRING)
                .addScalar("ruleName", Hibernate.STRING)
                .addScalar("selSum", Hibernate.INTEGER)
                .addScalar("quesSum", Hibernate.INTEGER)
                .addScalar("quesState", Hibernate.STRING)
                .addScalar("gBatch", Hibernate.STRING)
                .addScalar("gId", Hibernate.STRING)
                .addScalar("dataDate", Hibernate.STRING)
                .addScalar("quesId", Hibernate.STRING)
                .addScalar("bigClass", Hibernate.STRING)
                .addScalar("smallClass", Hibernate.STRING)
                .setCacheable(false);

我们今天的关于Java笔记之java.lang.String#trimjava lang.string的分享就到这里,谢谢您的阅读,如果想了解更多关于Android studio不兼容的类型需要java.lang.String找到java.lang.String、Android:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”、ArrayMap java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Object[]、herbetr 遇到 Cannot cast java.lang.Character to java.lang.Stringat java.lang.Class.cast的相关信息,可以在本站进行搜索。

本文标签: